home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / smail-3.1.28 / src / mkdriv.awk < prev    next >
Encoding:
AWK Script  |  1992-07-11  |  7.1 KB  |  310 lines

  1. # @(#)src/mkdriv.awk    1.3 7/11/92 11:53:31
  2.  
  3. #    Copyright (C) 1987, 1988 by Ronald S. Karr and Landon Curt Noll
  4. #    Copyright (C) 1992  Ronald S. Karr
  5. #
  6. # See the file COPYING, distributed with smail, for restriction
  7. # and warranty information.
  8.  
  9. # awk program used from the mkdrivtab.sh shell script in building the
  10. # drivertab.c file and makefiles for the directors/, routers/,
  11. # transports/, lib/ and lookup/ directories.
  12. #
  13. # this awk file takes care of parsing the file and producing on the
  14. # stdout directives and text which the shell can interpret to build the
  15. # correct files.  The directives are always of the form '%string' and
  16. # are used to indicate when the shell script should change state.
  17. #
  18. # See mkdrivtab.sh for details on the input format and on how this awk
  19. # script is used.
  20.  
  21. BEGIN {
  22.     n_director = 0
  23.     n_router = 0
  24.     n_transport = 0
  25.     n_lookup = 0
  26.     n_dlib = 0
  27.     n_rlib = 0
  28.     n_tlib = 0
  29.     n_llib = 0
  30.     lheader[" "] = ""
  31. }
  32.  
  33. $2 == "library" {
  34.     type = $1; d = 0; r = 0; t = 0; l = 0
  35.  
  36.     if (type == "director") d = 1
  37.     else if (type == "router") r = 1
  38.     else if (type == "transport") t = 1
  39.     else if (type == "lookup") l = 1
  40.     for (k = 3; k <= NF; k++) {
  41.         if ($k ~ /^.*\.c$/) {
  42.             if      (d) dlib[++n_dlib] = $k
  43.             else if (r) rlib[++n_rlib] = $k
  44.             else if (t) tlib[++n_tlib] = $k
  45.             else if (l) llib[++n_llib] = $k
  46.         } else if ($k ~ /^.*\.h$/) {
  47.             if    (d) dheader[$k] = $k
  48.             else if (r) rheader[$k] = $k
  49.             else if (t) theader[$k] = $k
  50.             else if (l) lheader[$k] = $k
  51.         }
  52.     }
  53.     next
  54. }
  55.  
  56. $1 == "director" || $1 == "router" || $1 == "transport" {
  57.     type = $1; d = 0; r = 0; t = 0
  58.  
  59.     if (type == "director") {
  60.         i = ++n_director
  61.         d = 1
  62.         prefix = "dt"
  63.     } else if (type == "router") {
  64.         i = ++n_router
  65.         r = 1
  66.         prefix = "rt"
  67.     } else if (type == "transport") {
  68.         i = ++n_transport
  69.         t = 1
  70.         prefix = "tp"
  71.     }
  72.     source = ""
  73.     header = ""
  74.     name = $2
  75.     cache = prefix "c_" name
  76.     driver = prefix "d_" name
  77.     verify = prefix "v_" name
  78.     finish = prefix "f_" name
  79.     builder = prefix "b_" name
  80.     for (k = 3; k <= NF; k++) {
  81.         if      ($k == "nofinish")  finish = "NULL"
  82.         else if ($k == "nocache")   cache = "NULL"
  83.         else if ($k == "nobuilder") builder = "NULL"
  84.         else if ($k ~ /^source=..*\.c$/) source = substr($k, 8)
  85.         else if ($k ~ /^header=./)  header = substr($k, 8)
  86.     }
  87.     if (! source) source = name ".c"
  88.     if (! header) header = substr(source, 1, length(source)-2) ".h"
  89.     if (d) {
  90.         dname[i] = name
  91.         dcache[i] = cache
  92.         ddriver[i] = driver
  93.         dverify[i] = verify
  94.         dfinish[i] = finish
  95.         dbuilder[i] = builder
  96.         dsource[source] = source
  97.         dheader[header] = header
  98.     } else if (r) {
  99.         rname[i] = name
  100.         rcache[i] = cache
  101.         rdriver[i] = driver
  102.         rverify[i] = verify
  103.         rfinish[i] = finish
  104.         rbuilder[i] = builder
  105.         rsource[source] = source
  106.         rheader[header] = header
  107.     } else if (t) {
  108.         tname[i] = name
  109.         tcache[i] = cache
  110.         tdriver[i] = driver
  111.         tverify[i] = verify
  112.         tfinish[i] = finish
  113.         tbuilder[i] = builder
  114.         tsource[source] = source
  115.         theader[header] = header
  116.     }
  117. }
  118.  
  119. $1 == "lookup" {
  120.     name = $2
  121.     lname[++n_lookup] = name
  122.     source = ""
  123.     header = ""
  124.     for (k = 3; k <= NF; k++) {
  125.         if ($k ~ /^source=..*\.c$/) source = substr($k, 8)
  126.         else if ($k ~ /^header=./)  header = substr($k, 8)
  127.     }
  128.     if (! source) source = name ".c"
  129.     lsource[source] = source
  130.     if (header) lheader[header] = header
  131. }
  132.  
  133. END {
  134.     for (i = 1; i <= n_director; i++) {
  135.         print "%CC%" dcache[i] "();"
  136.         print "%DD%" ddriver[i] "();"
  137.         print "%VV%" dverify[i] "();"
  138.         print "%FF%" dfinish[i] "();"
  139.         print "%BB%" dbuilder[i] "();"
  140.     }
  141.     for (i = 1; i <= n_router; i++) {
  142.         print "%CC%" rcache[i] "();"
  143.         print "%RD%" rdriver[i] "();"
  144.         print "%VV%" rverify[i] "();"
  145.         print "%FF%" rfinish[i] "();"
  146.         print "%BB%" rbuilder[i] "();"
  147.     }
  148.     for (i = 1; i <= n_transport; i++) {
  149.         print "%CC%" tcache[i] "();"
  150.         print "%TD%" tdriver[i] "();"
  151.         print "%FF%" tfinish[i] "();"
  152.         print "%BB%" tbuilder[i] "();"
  153.     }
  154.     for (i = 1; i <= n_lookup; i++) {
  155.         print "%LO%" lname[i] "_open" "();"
  156.         print "%LC%" lname[i] "_close" "();"
  157.         print "%LL%" lname[i] "_lookup" "();"
  158.     }
  159.     print
  160.     if (n_director) {
  161.         print "struct direct_driver direct_drivers[] = {"
  162.         for (i = 1; i <= n_director; i++) {
  163.             printf("%%drop { \"%s\",%s,%s,%s,%s,%s },\n",    \
  164.                 dname[i], dcache[i], ddriver[i],\
  165.                 dverify[i], dfinish[i], dbuilder[i])
  166.         }
  167.         printf "%%drop { NULL },\n};\n\n"
  168.     }
  169.     if (n_router) {
  170.         print "struct route_driver route_drivers[] = {"
  171.         for (i = 1; i <= n_router; i++) {
  172.             printf("%%drop { \"%s\",%s,%s,%s,%s,%s },\n",    \
  173.                 rname[i], rcache[i], rdriver[i],\
  174.                 rverify[i], rfinish[i], rbuilder[i])
  175.         }
  176.         printf "%%drop { NULL },\n};\n\n"
  177.     }
  178.     if (n_transport) {
  179.         print "struct transport_driver transport_drivers[] = {"
  180.         for (i = 1; i <= n_transport; i++) {
  181.             printf("%%drop { \"%s\",%s,%s,%s,%s },\n",    \
  182.                 tname[i], tcache[i], tdriver[i],\
  183.                 tfinish[i], tbuilder[i])
  184.         }
  185.         printf "%%drop { NULL },\n};\n\n"
  186.     }
  187.     if (n_lookup) {
  188.         print "struct lookup_proto lookup_protos[] = {"
  189.         for (i = 1; i <= n_lookup; i++) {
  190.             printf("%%drop ");
  191.             printf("{ \"%s\", %s_open, %s_close, %s_lookup },\n", \
  192.                 lname[i], lname[i], lname[i], lname[i])
  193.         }
  194.         printf "%%drop { NULL },\n};\n"
  195.     }
  196.  
  197.     for (step = 0; step < 4; step++) {
  198.         d = 0; r = 0; t = 0; l = 0
  199.         if (step == 0) {
  200.             if (n_director == 0) continue;
  201.             d = 1
  202.             type = "directors"
  203.             target = "ddrivlib"
  204.         } else if (step == 1) {
  205.             if (n_router == 0) continue;
  206.             r = 1
  207.             type = "routers"
  208.             target = "rdrivlib"
  209.         } else if (step == 2) {
  210.             if (n_transport == 0) continue;
  211.             t = 1
  212.             type = "transports"
  213.             target = "tdrivlib"
  214.         } else {
  215.             if (n_lookup == 0) continue;
  216.             l = 1
  217.             type = "lookup"
  218.             target = "ldrivlib"
  219.         }
  220.         print "%makefile_start " type
  221.         print "TARGET=" target ".a"
  222.         printf("OBJ=")
  223.         if (d) {
  224.             for (s in dsource) {
  225.                 printf(" %s.o", substr(s, 1, length(s)-2))
  226.             }
  227.             for (i = 1; i <= n_dlib; i++) {
  228.                 s = dlib[i]
  229.                 printf(" %s.o", substr(s, 1, length(s)-2))
  230.             }
  231.         }
  232.         if (r) {
  233.             for (s in rsource) {
  234.                 printf(" %s.o", substr(s, 1, length(s)-2))
  235.             }
  236.             for (i = 1; i <= n_rlib; i++) {
  237.                 s = rlib[i]
  238.                 printf(" %s.o", substr(s, 1, length(s)-2))
  239.             }
  240.         }
  241.         if (t) {
  242.             for (s in tsource) {
  243.                 printf(" %s.o", substr(s, 1, length(s)-2))
  244.             }
  245.             for (i = 1; i <= n_tlib; i++) {
  246.                 s = tlib[i]
  247.                 printf(" %s.o", substr(s, 1, length(s)-2))
  248.             }
  249.         }
  250.         if (l) {
  251.             for (s in lsource) {
  252.                 printf(" %s.o", substr(s, 1, length(s)-2))
  253.             }
  254.             for (i = 1; i <= n_llib; i++) {
  255.                 s = llib[i]
  256.                 printf(" %s.o", substr(s, 1, length(s)-2))
  257.             }
  258.         }
  259.         printf("\nCSRC=")
  260.         if (d) {
  261.             for (s in dsource) {
  262.                 printf(" %s", s)
  263.             }
  264.             for (i = 1; i <= n_dlib; i++) {
  265.                 printf(" %s", dlib[i])
  266.             }
  267.         }
  268.         if (r) {
  269.             for (s in rsource) {
  270.                 printf(" %s", s)
  271.             }
  272.             for (i = 1; i <= n_rlib; i++) {
  273.                 printf(" %s", rlib[i])
  274.             }
  275.         }
  276.         if (t) {
  277.             for (s in tsource) {
  278.                 printf(" %s", s)
  279.             }
  280.             for (i = 1; i <= n_tlib; i++) {
  281.                 printf(" %s", tlib[i])
  282.             }
  283.         }
  284.         if (l) {
  285.             for (s in lsource) {
  286.                 printf(" %s", s)
  287.             }
  288.             for (i = 1; i <= n_llib; i++) {
  289.                 printf(" %s", llib[i])
  290.             }
  291.         }
  292.         printf("\nHSRC=")
  293.         if (d) for (s in dheader) {
  294.             printf(" %s", s)
  295.         }
  296.         if (r) for (s in rheader) {
  297.             printf(" %s", s)
  298.         }
  299.         if (t) for (s in theader) {
  300.             printf(" %s", s)
  301.         }
  302.         if (l) for (s in lheader) {
  303.             if (s != " ") {
  304.                 printf(" %s", s)
  305.             }
  306.         }
  307.         printf("\n%%makefile_end\n")
  308.     }
  309. }
  310.